package com.allwees.support.fileservice.service;

import com.allwees.core.common.util.BeanUtil;
import com.allwees.support.fileservice.FileException;
import com.allwees.support.fileservice.model.FileEntity;
import com.allwees.support.fileservice.model.PutFileResult;

import java.io.InputStream;
import java.util.Collection;

/**
 * 提供统一的文件存储接口。兼容本地文件存储，阿里云开放存储服务OSS。
 *
 * @author yangylsky
 */
public interface FileService {
	String getType();

	boolean isMajor();

	/**
	 * 终端访问的前缀
	 *
	 * @return
	 */
	String getAccessPrefix();

	/**
	 * 生成存储到FileService的完整key
	 *
	 * @param key
	 * @return
	 */
	String genFileKey(String key);

	/**
	 * 创建一个文件容器单位
	 *
	 * @param bucket
	 */
	void createBucket(String bucket);

	/**
	 * 指定的容器单位是否存在
	 *
	 * @param bucket
	 * @return
	 */
	boolean isBucketExist(String bucket);

	/**
	 * 传入文件内容到指定的容器单位
	 *
	 * @param bucket
	 * @param key
	 * @param content
	 * @param length
	 * @return
	 */
	PutFileResult putFile(String bucket, String key, InputStream content, long length);

	/**
	 * 传入文件内容到指定的容器单位
	 *
	 * @param bucket
	 * @param key
	 * @param content
	 * @return
	 */
	PutFileResult putFile(String bucket, String key, byte[] content);

	/**
	 * 获取指定的文件完整信息
	 *
	 * @param bucket
	 * @param key
	 * @return
	 */
	FileEntity getFileEntity(String bucket, String key);

	static FileService findMajorFileService() {
		Collection<FileService> fileServices = BeanUtil.getBeans(FileService.class);
		for(FileService fileService : fileServices) {
			if(fileService.isMajor()) {
				return fileService;
			}
		}
		throw new FileException("找不到FileService[major]");
	}

}
